package com.nuc.zyt.day02.junit;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName App
 * @Description TODO
 * @Author 耀酱
 * @Date 2023/5/15 10:39
 * @Version 1.0
 */

public class App {
    public static void main(String[] args) {
        try{
            Class<?> aClass = Class.forName("com.nuc.zyt.day02.junit.HelloDaoTest");
            Object o = aClass.newInstance();
            // 得到此类包括其父类的所有public方法
            for (Method method : aClass.getDeclaredMethods()) {
                System.out.println(method);
            }
            Method[] methods = aClass.getDeclaredMethods();


            // 3.迭代出每一个Method对象，判断哪些方法上使用了@MyBefore/@MyAfter/@MyTest注解
            List<Method> myBeforeList = new ArrayList<>();
            List<Method> myAfterList = new ArrayList<>();
            List<Method> myTestList = new ArrayList<>();
            for (Method method : methods) {
                if (method.isAnnotationPresent(MyBefore.class)) {
                    //存储使用了@MyBefore注解的方法对象
                    myBeforeList.add(method);
                } else if (method.isAnnotationPresent(MyTest.class)) {
                    //存储使用了@MyTest注解的方法对象
                    myTestList.add(method);
                } else if (method.isAnnotationPresent(MyAfter.class)) {
                    //存储使用了@MyAfter注解的方法对象
                    myAfterList.add(method);
                }
            }

            // 先执行@MyBefore的方法
            for (Method beforeMethod : myBeforeList) {
                beforeMethod.invoke(o);
            }

            // 执行方法测试
            for (Method testMethod : myTestList) {

                // 测试方法
                testMethod.invoke(o);

            }

            // 最后执行@MyAfter的方法
            for (Method afterMethod : myAfterList) {
                afterMethod.invoke(o);
            }

//            // 执行方法测试
//            for (Method testMethod : myTestList) {
//                // 先执行@MyBefore的方法
//                for (Method beforeMethod : myBeforeList) {
//                    beforeMethod.invoke(o);
//                }
//                // 测试方法
//                testMethod.invoke(o);
//                // 最后执行@MyAfter的方法
//                for (Method afterMethod : myAfterList) {
//                    afterMethod.invoke(o);
//                }
//            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {

        }

    }
}
